1 !COPYRIGHT 1985 BY:          KENNETH FINTO
2 !ALL RIGHTS RESERVED
3 !*************************
4 !* I WROTE THIS SOMETIME *   * BACK IN 1985.         *   * UNFORTUNATELY WITHOUT *   * THE INSTRUCTIONS!!    *
5 !* BUT ALL YOU NEED TO   *   * KNOW IS:              *   * FIGHT OR DIE!!!       *   *                       *   * HOW TO KILL THE ENEMY:*
6 !* LEVEL 1: ONE   SHOT   *   * LEVEL 2: TWO   SHOTS  *   * LEVEL 3: THREE SHOTS  *   * AND UP : THREE SHOTS  *   *                       *
7 !* REFUEL AT END OF EACH *   * LEVEL BY DOCKING WITH *   * MOTHERSHIP.           *   *                       *   * KENNETH FINTO 03/28/87*
8 !* ROUTE 2 BOX 44        *   * ROSEBUD TEXAS 76570   *   *                       *   * GENIE ADDRESS:        *   * KEN.FINTO             *
9 !*                       *   *************************
120 CALL CLEAR :: CALL MAGNIFY(3)
130 DISPLAY AT(8,7):"PLANET DEFENDER"
140 DISPLAY AT(10,14):"BY"
150 DISPLAY AT(12,8):"KENNETH FINTO"
160 DISPLAY AT(22,7):"COPYRIGHT 1985"
170 DISPLAY AT(24,4)BEEP :"ALL RIGHTS RESERVED"
180 FOR DELAY=1 TO 500 :: NEXT DELAY
190 CALL CLEAR
200 DISPLAY AT(2,1):"PLEASE SELECT ONE SPEED"
210 DISPLAY AT(5,1):"1) SLOW": :"2) MEDIUM": :"3) FAST": :"ENTER LEVEL (1-3)"
220 ON WARNING NEXT :: ACCEPT AT(11,19)VALIDATE("123")SIZE(1)BEEP :LEVEL
230 LEVEL=LEVEL+1
240 SCR=1
250 CALL SCREEN(2) :: FOR X=0 TO 14 :: CALL COLOR(X,2,2) :: NEXT X
260 CALL CHARPAT(43,C$)
270 CALL CHAR(40,C$&RPT$("0",48))
280 FOR X=1 TO 15 :: READ CHARNO,CHAR$ :: CALL CHAR(CHARNO,CHAR$) :: NEXT X
290 DATA 96,00000000001E3F1F0000000000000000000000000000F8E00000000000000000
300 DATA 108,0000000000000000000000000000000000000000000C1C3C7CFCFCFC7C3C1C0C
310 DATA 112,00000000000000000000000000000000000000000000000000000000C0C00000
320 DATA 116,000000000000000000071F7F767F1F07000000000000000000C0F0FCDCFCF0C0
330 DATA 120,0000000000000000000000000000000000000000000000000000000000808080
340 DATA 124,0000000000000001000000000000000000000000000000000000000000000000
350 DATA 128,0000000000000000000102041F0402010000000000000000001C3060C060301C
360 DATA 136,00000000000000000000000F193F190F0000000000000000000000F098FC98F0
370 DATA 100,FFFFFFFFFFFFFFFF
380 DATA 132,0000FFFF00000000
390 DATA 88,FFFFFFFFFFFFFFFF
400 DATA 89,FCFCFCFCFCFCFCFC
410 DATA 90,F0F0F0F0F0F0F0F0
420 DATA 91,C0C0C0C0C0C0C0C0
430 DATA 92,0000000000000000
440 CALL CLEAR :: CALL HCHAR(21,1,100,128)
450 DIM STAT$(14),DIST(12),LS(14) :: AP=AP+1 :: AP=MIN(3,AP)
460 FOR X=1 TO 14
470 LS(X)=AP
480 NEXT X
490 FOR X=1 TO 12
500 STAT$(X)="ON"
510 NEXT X
520 ES=136 :: FL=0
530 FOR X=3 TO 6
540 L=L+50
550 CALL SPRITE(#X,120,16,145,L,0,-4)
560 NEXT X
570 DISPLAY AT(1,4):"SCORE  SHIPS LEFT  FUEL"
580 DISPLAY AT(2,2):USING "#######":SCORE
590 CALL HCHAR(3,1,132,32)
600 CALL COLOR(13,3,2)
610 FOR X=3 TO 7
620 CALL COLOR(X,16,2)
630 NEXT X
640 CALL COLOR(8,7,16)
650 CALL COLOR(9,3,2)
660 CALL SPRITE(#7,ES,11,25,180,0,-4*LEVEL)
670 CALL SPRITE(#8,ES,11,25,210,0,-4*LEVEL)
680 CALL SPRITE(#9,ES,11,40,157,0,-4*LEVEL)
690 CALL SPRITE(#10,ES,11,40,230,0,-4*LEVEL)
700 CALL SPRITE(#11,ES,11,55,176,0,-4*LEVEL)
710 CALL SPRITE(#12,ES,11,55,206,0,-4*LEVEL)
720 SHIPS=3
730 LEV=MIN(LEVEL*2,6)
740 DISPLAY AT(2,15)SIZE(2):USING "##":SHIPS
750 CALL SPRITE(#1,96,15,25,10)
760 DISPLAY AT(2,23):"XXXXX"
770 GOSUB 1430
780 IF FUELEV/2<>INT(FUELEV/2)THEN CALL POSITION(#1,PP1,PP2)
790 CALL PEEK(-31878,N)
800 IF N<7 THEN 1710
810 CALL PEEK(-31877,N)
820 IF N AND 32 THEN CALL SOUND(1000,-7,0) :: STAT$(1)="OFF" :: SHIPS=SHIPS-1 :: DISPLAY AT(2,15)SIZE(2):USING "##":SHIPS :: FL=0 ELSE 840
830 CALL DELSPRITE(#1) :: IF SHIPS=0 THEN 1940 ELSE 750
840 FUELEV=FUELEV+1
850 IF FUELEV/2=INT(FUELEV/2)THEN 860 ELSE 940
860 GOSUB 1430
870 CALL POSITION(#1,P1,P2) :: IF P1=PP1 AND P2=PP2 THEN 880 ELSE 940
880 FOR CHROU=7 TO HISPR
890 IF STAT$(CHROU)="ON" THEN CALL POSITION(#CHROU,E1,E2,#1,P1,P2)ELSE 930
900 IF E1<P1-3 AND E1>P1-9 THEN 910 ELSE 930
910 CALL SPRITE(#2,124,16,E1,E2,0,(P2-E2)*.49) :: CALL SOUND(400,-3,14) :: CALL SOUND(120,110,6)
920 CALL DELSPRITE(#1,#2) :: CALL SOUND(1000,-7,0) :: STAT$(1)="OFF" :: SHIPS=SHIPS-1 :: FL=0 :: DISPLAY AT(2,15)SIZE(2):USING "##":SHIPS :: IF SHIPS=0 THEN 1940 ELSE 750
930 NEXT CHROU
940 IF FUELEV/3=INT(FUELEV/3)THEN 950 ELSE 1140
950 CALL PEEK(-31878,HISPR) :: HISPR=MIN(12,HISPR)
960 FOR CHRU=7 TO HISPR
970 GOSUB 1430
980 IF STAT$(CHRU)="ON" THEN CALL POSITION(#CHRU,E1,E2) :: E1=MIN(E1,130) :: CALL LOCATE(#CHRU,E1+LEV,E2)
990 IF E1>121 THEN 1000 ELSE 1130
1000 FOR CFM=3 TO 6
1010 IF STAT$(CHRU)="ON" AND STAT$(CFM)="ON" THEN CALL POSITION(#CHRU,E1,E2,#CFM,C1,C2) :: IF E2>C2+10 OR E2<C2-10 AND E2<30 THEN 1020 ELSE CALL DELSPRITE(#CFM) :: DM=DM+1 :: GOTO 1040 ELSE 1110
1020 GOSUB 1430
1030 GOTO 1010
1040 CALL MOTION(#CHRU,-4,0)
1050 GOSUB 1430
1060 CALL POSITION(#CHRU,E1,E2)
1070 GOSUB 1430
1080 IF E1<35 THEN CALL DELSPRITE(#CHRU) :: STAT$(CHRU)="OFF" :: STAT$(CFM)="OFF" ELSE 1060
1090 IF DM=4 THEN 1940
1100 CFM=6
1110 NEXT CFM
1120 IF STAT$(CHRU)="ON" THEN 1000
1130 NEXT CHRU
1140 IF FUELEV/12=INT(FUELEV/12)THEN 1150 ELSE 770
1150 FL=FL+1
1160 ON FL GOTO 1170,1180,1190,1200,1210,1220,1230,1240,1250,1260,1270,1280,1290,1300,1310,1320,1330,1340,1350,1360,1370
1170 DISPLAY AT(2,23):"XXXXY" :: ON SCR GOTO 770,2170,2350
1180 DISPLAY AT(2,23):"XXXXZ" :: ON SCR GOTO 770,2170,2350
1190 DISPLAY AT(2,23):"XXXX[" :: ON SCR GOTO 770,2170,2350
1200 DISPLAY AT(2,23):"XXXX\" :: ON SCR GOTO 770,2170,2350
1210 DISPLAY AT(2,23):"XXXY\" :: ON SCR GOTO 770,2170,2350
1220 DISPLAY AT(2,23):"XXXZ\" :: ON SCR GOTO 770,2170,2350
1230 DISPLAY AT(2,23):"XXX[\" :: ON SCR GOTO 770,2170,2350
1240 DISPLAY AT(2,23):"XXX\\" :: ON SCR GOTO 770,2170,2350
1250 DISPLAY AT(2,23):"XXY\\" :: ON SCR GOTO 770,2170,2350
1260 DISPLAY AT(2,23):"XXZ\\" :: ON SCR GOTO 770,2170,2350
1270 DISPLAY AT(2,23):"XX[\\" :: ON SCR GOTO 770,2170,2350
1280 DISPLAY AT(2,23):"XX\\\" :: ON SCR GOTO 770,2170,2350
1290 DISPLAY AT(2,23):"XY\\\" :: ON SCR GOTO 770,2170,2350
1300 DISPLAY AT(2,23):"XZ\\\" :: ON SCR GOTO 770,2170,2350
1310 DISPLAY AT(2,23):"X[\\\" :: ON SCR GOTO 770,2170,2350
1320 DISPLAY AT(2,23):"X\\\\" :: ON SCR GOTO 770,2170,2350
1330 DISPLAY AT(2,23):"Y\\\\" :: ON SCR GOTO 770,2170,2350
1340 DISPLAY AT(2,23):"Z\\\\" :: ON SCR GOTO 770,2170,2350
1350 DISPLAY AT(2,23):"[\\\\" :: ON SCR GOTO 770,2170,2350
1360 DISPLAY AT(2,23):"\\\\\" :: ON SCR GOTO 770,2170,2350
1370 CALL MOTION(#1,8,0)
1380 CALL POSITION(#1,P1,P2)
1390 IF P1>148 THEN CALL DELSPRITE(#1) :: CALL SOUND(1000,-7,0) :: SHIPS=SHIPS-1 :: FL=0 :: IF SHIPS=0 THEN 1940 ELSE ON SCR GOTO 750,2410,2410
1400 CALL SOUND(-100,-2,0)
1410 CALL SOUND(-100,-3,0)
1420 GOTO 1370
1430 CALL JOYST(1,XX,YY) :: CALL KEY(1,K,S)
1440 CALL MOTION(#1,-YY*2,0)
1450 IF K=18 THEN 1460 ELSE RETURN
1460 CALL PEEK(-31878,HISPR) :: HISPR=MIN(12,HISPR)
1470 CALL PEEK(-31877,N)
1480 IF N AND 32 THEN CALL DELSPRITE(#1) :: CALL SOUND(1000,-7,0) :: STAT$(1)="OFF" :: SHIPS=SHIPS-1 :: FL=0 ELSE 1500
1490 DISPLAY AT(2,15)SIZE(2):USING "##":SHIPS :: IF SHIPS=0 THEN 1940 ELSE 750
1500 STD=30000 :: SN=0
1510 FOR CHROU=7 TO HISPR
1520 CALL PEEK(-31877,N)
1530 IF N AND 32 THEN CALL DELSPRITE(#1) :: CALL SOUND(1000,-7,0) :: STAT$(1)="OFF" :: SHIPS=SHIPS-1 :: FL=0 ELSE 1550
1540 DISPLAY AT(2,15)SIZE(2):USING "##":SHIPS :: IF SHIPS=0 THEN 1940 ELSE 750
1550 CALL POSITION(#1,P1,P2,#CHROU,E1,E2)
1560 IF ES=108 THEN 1570 ELSE IF ES=112 THEN 1580 ELSE IF E1>P1-3 OR E1<P1-9 THEN 1600 ELSE IF E2>LEVEL*25 THEN 1590 ELSE 1600
1570 IF E1>P1+4 OR E1<P1-9 THEN 1600 ELSE IF E2>LEVEL*25 THEN 1590 ELSE 1600
1580 IF E1>P1-5 OR E1<P1-7 THEN 1600 ELSE IF E2>LEVEL*25 THEN 1590 ELSE 1600
1590 IF STAT$(CHROU)="ON" THEN IF STD>E2-P2 THEN STD=E2-P2 :: SN=CHROU
1600 NEXT CHROU
1610 IF SN=0 THEN 1690 ELSE CALL POSITION(#SN,Y,X,#1,R,C) :: IF Y>R+4 OR Y<R-9 THEN 1690 ELSE CALL SPRITE(#2,124,16,R,C,0,(X-C)*.49)
1620 CALL SOUND(400,-3,14)
1630 CALL SOUND(120,110,6)
1640 HS=LS(SN)
1650 HS=HS-1
1660 LS(SN)=HS
1670 IF LS(SN)=0 THEN CALL DELSPRITE(#2,#SN) :: SCORE=SCORE+50 :: DISPLAY AT(2,2)SIZE(10):USING "#######":SCORE :: STAT$(SN)="OFF" :: RETURN ELSE 1680
1680 CALL DELSPRITE(#2) :: RETURN
1690 CALL POSITION(#1,P1,P2) :: CALL SPRITE(#2,124,16,P1,P2,0,105)
1700 CALL SOUND(476,-3,14) :: CALL SOUND(120,110,6) :: CALL DELSPRITE(#2) :: RETURN
1710 FOR X=1 TO 14
1720 LS(X)=AP
1730 NEXT X
1740 IF ES=136 THEN ES=108 :: GOTO 1840
1750 IF ES=108 THEN ES=116 :: GOTO 1840
1760 IF ES=116 THEN ES=128 :: GOTO 1840
1770 IF ES=128 THEN ES=112 :: GOTO 1840
1780 IF ES=112 THEN ES=136
1790 GOSUB 2010
1800 AP=AP+1 :: AP=MIN(3,AP)
1810 FOR X=1 TO 14
1820 LS(X)=AP
1830 NEXT X
1840 CALL SPRITE(#7,ES,11,25,180,0,-4*LEVEL)
1850 CALL SPRITE(#8,ES,11,25,210,0,-4*LEVEL)
1860 CALL SPRITE(#9,ES,11,40,157,0,-4*LEVEL)
1870 CALL SPRITE(#10,ES,11,40,230,0,-4*LEVEL)
1880 CALL SPRITE(#11,ES,11,55,176,0,-4*LEVEL)
1890 CALL SPRITE(#12,ES,11,55,206,0,-4*LEVEL)
1900 FOR X=7 TO 12
1910 STAT$(X)="ON"
1920 NEXT X
1930 GOTO 770
1940 CALL DELSPRITE(ALL) :: CALL CLEAR :: CALL CHARSET :: CALL SCREEN(8)
1950 IF SCORE>HISCORE THEN HISCORE=SCORE
1960 DISPLAY AT(4,7):"YOUR SCORE " :: DISPLAY AT(4,19):USING "#######":SCORE
1970 DISPLAY AT(6,7):"HIGH SCORE " :: DISPLAY AT(6,19):USING "#######":HISCORE
1980 DISPLAY AT(12,7)BEEP :"PLAY AGAIN? (Y/N)"
1990 ACCEPT AT(12,25)SIZE(1)VALIDATE("YN"):AN$
2000 IF AN$="Y" THEN RESTORE :: AP,SCORE,L=0 :: GOTO 190 ELSE CALL CLEAR :: GOTO 2510
2010 SC=25
2020 SCR=2
2030 SFM=4
2040 IF AP=2 THEN SFM=5 ELSE IF AP=3 THEN SFM=6
2050 FOR X=2 TO 6
2060 CALL SPRITE(#X,40,3,SC,160,SFM,0)
2070 SC=SC+40
2080 NEXT X
2090 SC=16
2100 FOR X=7 TO 24 STEP 3
2110 CALL SPRITE(#X,40,3,SC,176,SFM,0)
2120 CALL SPRITE(#X+1,40,3,SC,192,SFM,0)
2130 CALL SPRITE(#X+2,40,3,SC,208,SFM,0)
2140 SC=SC+40
2150 NEXT X
2160 CALL HCHAR(9,29,88,4) :: CALL HCHAR(11,29,88,4)
2170 CALL JOYST(1,CC,RR)
2180 IF CC<>0 THEN CC=CC/4
2190 IF RR<>0 THEN RR=RR/4
2200 XX=(XX+CC) :: YY=(YY-RR)
2210 YY=MIN(8,YY) :: XX=MIN(8,XX) :: YY=MAX(-8,YY) :: XX=MAX(0,XX)
2220 CALL MOTION(#1,YY,XX)
2230 CALL PEEK(-31877,N)
2240 IF N AND 32 THEN 2250 ELSE 2270
2250 CALL SOUND(-1000,-7,0) :: STAT$(1)="OFF" :: SHIPS=SHIPS-1 :: DISPLAY AT(2,15)SIZE(2):USING "##":SHIPS :: FL=0
2260 CALL DELSPRITE(#1) :: IF SHIPS=0 THEN 1940 ELSE CALL SPRITE(#1,96,15,25,10) :: GOTO 2410
2270 CALL POSITION(#1,RRS,CCS)
2280 IF RRS>57 AND RRS<68 OR RRS>73 AND RRS<83 THEN IF CCS>211 THEN 2250
2290 CALL POSITION(#1,RRS,CCS)
2300 IF RRS>67 AND RRS<74 AND CCS>232 THEN 2310 ELSE 2380
2310 SCR=3 :: CALL MOTION(#1,0,0)
2320 FOR FL=20 TO 1 STEP-1
2330 CALL SOUND(-1000,-3,FL)
2340 GOTO 1160
2350 NEXT FL
2360 DISPLAY AT(2,23):"XXXXX" :: SHIPS=SHIPS+1 :: DISPLAY AT(2,15)SIZE(2):USING "##":SHIPS :: SCORE=SCORE+500 :: DISPLAY AT(2,2)SIZE(10):USING "#######":SCORE
2370 FOR FL=1 TO 300 :: NEXT FL :: FL=0 :: GOTO 2410
2380 FUELEV=FUELEV+1
2390 IF FUELEV/20=INT(FUELEV/20)THEN 1150
2400 GOTO 2170
2410 SCR=1
2420 CALL DELSPRITE(ALL)
2430 CALL SPRITE(#1,96,15,25,10)
2440 L=0
2450 CALL HCHAR(9,29,32,4) :: CALL HCHAR(11,29,32,4)
2460 FOR X=3 TO 6
2470 L=L+50
2480 IF STAT$(X)="ON" THEN CALL SPRITE(#X,120,16,145,L,0,-4)
2490 NEXT X
2500 RETURN
2510 END
